﻿using JT808Protocol.Common;
using JT808Protocol.Models.Enums;
using System;
using System.Collections.Generic;

namespace JT808Protocol.Models.BodyParserStrategy
{
    public class DpFileUpload_0x9206 : IJT808Body
    {
        /// <summary>
        /// 服务器地址长度
        /// </summary>
        public byte FtpServerLen { get; set; }

        /// <summary>
        /// 服务器地址
        /// </summary>
        public string FtpServer { get; set; }

        /// <summary>
        /// 端口
        /// </summary>
        public ushort Port { get; set; }

        /// <summary>
        /// 用户名长度
        /// </summary>
        public byte UserNameLen { get; set; }

        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 密码长度
        /// </summary>
        public byte PasswordLen { get; set; }

        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// 文件上传路径长度
        /// </summary>
        public byte PathLen { get; set; }

        /// <summary>
        /// 文件上传路径
        /// </summary>
        public string Path { get; set; }

        /// <summary>
        /// 通道号
        /// </summary>
        public byte Channel { get; set; }

        /// <summary>
        /// 开始时间 BCD[6]
        /// </summary>
        public DateTime StartTime { get; set; }

        /// <summary>
        /// 结束时间 BCD[6]
        /// </summary>
        public DateTime EndTime { get; set; }

        /// <summary>
        /// 报警标志 8字节,暂时设置为无参数
        /// </summary>
        public byte[] AlarmFlag { get; set; }

        /// <summary>
        /// 音视频类型（0 音视频，1 音频，2 视频 3.视频或音视频）
        /// </summary>
        public EnumAvType AvType;

        /// <summary>
        /// 码流类型,1 主码流，2 子码流
        /// </summary>
        public byte CodeStreamType;

        /// <summary>
        /// 存储器类型，0 所有存储器 1 主存储器，2 灾备存储器
        /// </summary>
        public byte StorageType;

        /// <summary>
        /// 任务执行条件
        /// 用bit位表示：
        /// bit0：WIFI,为1时表示WI-FI下可下载；
        /// bit1：LAN,为1时表示LAN连接时可下载；
        /// bit2:3G/4G,为1时表示3G/4G连接时可下载
        /// </summary>
        public byte TaskExecutionCondition;

        public DpFileUpload_0x9206()
        {
            this.AvType = EnumAvType.AudioOrVideo;
            this.StorageType = 0x00;
            this.CodeStreamType = 0x00;
            this.AlarmFlag = ParseHelper.Bytes(ulong.MinValue);

            this.TaskExecutionCondition = 0x01;
            this.TaskExecutionCondition |= 0x01 << 1;
            this.TaskExecutionCondition |= 0x01 << 2;
        }

        public override IJT808Body ReadBody(ReadOnlySpan<byte> data, ref int index)
        {
            throw new NotImplementedException();
        }

        public override List<byte> WriteToBytes()
        {
            List<byte> bytes = new List<byte>();
            FtpServerLen = Convert.ToByte(FtpServer.Length);

            //服务器地址长度
            bytes.Add(FtpServerLen);

            //服务器地址
            bytes.AddRange(ParseHelper.AsciiBytes(FtpServer));

            //端口
            bytes.AddRange(ParseHelper.Bytes(Port));

            //用户名长度
            UserNameLen = Convert.ToByte(UserName.Length);
            bytes.Add(UserNameLen);

            //用户名
            bytes.AddRange(ParseHelper.AsciiBytes(UserName));

            //密码长度
            PasswordLen = Convert.ToByte(Password.Length);
            bytes.Add(PasswordLen);

            //密码
            bytes.AddRange(ParseHelper.AsciiBytes(Password));

            //文件上传路径长度
            PathLen = Convert.ToByte(Path.Length);
            bytes.Add(PathLen);

            //文件上传路径
            bytes.AddRange(ParseHelper.AsciiBytes(Path));

            //逻辑通道号
            bytes.Add(Channel);

            //开始时间
            bytes.AddRange(ParseHelper.DatetimeToBCD(StartTime));

            //结束时间
            bytes.AddRange(ParseHelper.DatetimeToBCD(EndTime));

            //报警标志，暂时设置为无参数
            bytes.AddRange(AlarmFlag);

            //音视频类型
            bytes.Add((byte)(AvType));

            //码流类型
            bytes.Add(CodeStreamType);

            //存储器类型
            bytes.Add(StorageType);

            //任务执行条件
            bytes.Add(TaskExecutionCondition);

            return bytes;
        }
    }
}